package cool.ale.errorMessage.config.redis.impl;

import cool.ale.errorMessage.constant.AleErrorMessageConst;
import cool.ale.errorMessage.config.redis.AleErrorMessageRedisService;
import cool.ale.util.bean.AleBeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.List;
import java.util.function.Function;

/***
 * redis操作实现类
 *
 * @author dujlc
 * @date 2022/12/3 8:00
 * @since 1.0
 */
@Slf4j
@Service
public class AleErrorMessageRedisServiceImpl implements AleErrorMessageRedisService {

    @Autowired
    private ApplicationContext applicationContext;

    /**
     * 通用的管理jedis资源的方法
     * @param function      入参
     * @return      返回值
     */
    private Object execute(Function<Jedis, Object> function) {
        Object result = null;
        // 判断redis是否注入
        // 如果不等于null，说明已经注入
        JedisPool aleErrorMessageJedisPool = null;
        try {
            aleErrorMessageJedisPool = (JedisPool) applicationContext.getBean(AleErrorMessageConst.INLINE_JEDIS_POOL_NAME);
        }catch (Exception e){
            // 如果不能强转的话，则说明没有配置
            // 这个直接返回 null 到业务代码
            return null;
        }
        // 可以强转，则拿去使用
        try(Jedis jedis = aleErrorMessageJedisPool.getResource()) {
            result = function.apply(jedis);
        }catch (Exception e){
            log.info("redis获取资源异常，异常信息为:{}", e.toString());
        }
        return result;
    }

    /**
     * jedis写入数据
     * @param key       写入数据的key
     * @param value     写入数据的value
     * @return  返回执行状态，成功---OK
     */
    @Override
    public String set(String key, String value) {
        return new AleBeanUtil<String>().checkReturnNullOrAppointType(
                execute(jedis -> jedis.set(key, value))
        );
    }

    /**
     * jedis获取数据
     * @param key       获取数据的key
     * @return      返回获取到的数据
     */
    @Override
    public String get(String key) {
        return new AleBeanUtil<String>().checkReturnNullOrAppointType(
                execute(jedis -> jedis.get(key))
        );
    }

    /**
     * jedis批量写入数据
     * @param var       传入进来的批量参数 key1 value1 key2 value2 key3 value3 ...
     * @return      返回执行状态，成功---OK
     */
    @Override
    public String mset(String... var) {
        return new AleBeanUtil<String>().checkReturnNullOrAppointType(
                execute(jedis -> jedis.mset(var))
        );
    }

    /**
     * jedis批量获取数据
     * @param var       传入进来的批量参数 key1 value1 key2 value2 key3 value3 ...
     * @return      返回输入批量key的结果
     */
    @Override
    public List<String> mget(String... var) {
        return new AleBeanUtil<List<String>>().checkReturnNullOrAppointType(
                execute(jedis -> jedis.mget(var))
        );
    }

    /**
     * 执行lua脚本
     *
     * @param script 传入的脚本代码
     * @param keys   传入的key值参数列表
     * @param args   传入的value值参数列表
     * @return 返回执行后的结果
     */
    @Override
    public Object eval(String script, List<String> keys, List<String> args) {
        // 不指定的时候就是 Object
        return new AleBeanUtil<>().checkReturnNullOrAppointType(
                execute(jedis -> jedis.eval(script, keys, args))
        );
    }


}
